8.6 线性查找

线性查找是最基础的一种查找算法。其思想非常简单,就是从头到尾依次遍历整个数组或列表,逐个元素进行比较,直到找到目标元素为止。

由于其实现和理解非常直观,线性查找通常是学习查找算法的第一步。

本节代码存放目录为 lesson20

概念与原理

线性查找的原理如下:

  • 从序列的第一个元素开始,与目标值进行比较。

  • 如果当前元素与目标值相等,则查找成功,返回该元素的索引。

  • 如果不相等,则继续比较下一个元素,直到找到目标值或者遍历完整个序列。

  • 如果遍历完整个序列仍未找到目标值,则返回未找到。


线性查找的特点如下:

  • 时间复杂度:最坏情况下,线性查找需要遍历整个数组,因此其时间复杂度为 O(n)

  • 适用场景:线性查找适用于任何类型的列表或数组,尤其是当数据量较小或数据未排序时。

  • 稳定性:线性查找是稳定的查找算法。


线性查找的步骤示例

给定如下数组,目标是查找元素 4

[5, 3, 8, 4, 2]

通过线性查找的步骤如下:

第一轮:

- 比较 arr[0] 与目标值 4,不相等,继续查找。

第二轮:

- 比较 arr[1] 与目标值 4,不相等,继续查找。

第三轮:

- 比较 arr[2] 与目标值 4,不相等,继续查找。

第四轮:

- 比较 arr[3] 与目标值 4,相等,查找成功,返回索引 3。

最终,目标值 4 位于索引 3,查找成功。


线性查找的时间复杂度

线性查找的时间复杂度取决于目标值在数组中的位置:

  • 最坏情况O(n),即目标值位于数组末尾或不在数组中。

  • 最好情况O(1),即目标值位于数组的第一个位置。

  • 平均情况O(n),即目标值随机分布在数组中。

由于线性查找需要逐个比较元素,它的时间复杂度随着数组长度的增加而线性增长,因此在数据量较大时,线性查找的效率较低。

Go 语言的实现

实现代码如下:

// linearSearch 实现线性查找
func linearSearch(arr []int, target int) int {
    // 遍历数组
    for i, val := range arr {
        // 如果找到目标值,返回其索引
        if val == target {
            return i
        }
    }
    // 如果找不到,返回 -1
    return -1
}

func main() {
    arr := []int{5, 3, 8, 4, 2}
    target := 4

    // 执行线性查找
    result := linearSearch(arr, target)

    if result != -1 {
        fmt.Printf("元素 %d 找到,索引为: %d\n", target, result)
    } else {
        fmt.Println("元素未找到")
    }
}

执行结果如下所示:

元素 4 找到,索引为: 3

在上面的代码中,linearSearch 函数通过 for 循环遍历数组,如果找到目标值则返回其索引,否则返回 -1 表示未找到。

小结

本节我们讲解了线性查找的基本原理、步骤示例和 Go 语言的实现。

关于本节总结如下:

  • 时间复杂度:线性查找的时间复杂度为 O(n),适用于数据量较小的场景。

  • 适用场景:线性查找适合无序数组,特别是在数据量较小或者不经常进行查找操作的情况下。

  • 局限性:线性查找效率较低,不适用于大规模数据集。

results matching ""

    No results matching ""